package com.grj.park.boot.controller;

import com.grj.park.boot.domain.Permission;
import com.grj.park.boot.domain.R;
import com.grj.park.boot.service.PermissionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/permission")
@Api(tags = "权限管理控制器")
@RequiredArgsConstructor
public class PermissionController {

    private final PermissionService permissionService;

    /**
     * 添加权限
     * @param permission 权限对象
     * @return 添加结果
     */
    @PostMapping
    @ApiOperation("添加权限")
    public R<Void> postPermission(@RequestBody @Valid Permission permission) {
        permissionService.postPermission(permission);
        return R.okMsg("添加权限成功");
    }

    /**
     * 更新权限
     * @param permission 权限对象
     * @return 更新结果
     */
    @PutMapping
    @ApiOperation("更新权限")
    public R<Void> putPermission(@RequestBody @Valid Permission permission) {
        permissionService.putPermission(permission);
        return R.okMsg("更新权限成功");
    }

    /**
     * 删除权限
     * @param id 权限 ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @ApiOperation("删除权限")
    public R<Void> delPermission(@PathVariable Long id) {
        permissionService.delPermission(id);
        return R.okMsg("删除权限成功");
    }

    /**
     * 获取权限详情
     * @param id 权限 ID
     * @return 权限详情
     */
    @GetMapping("/{id}")
    @ApiOperation("获取权限详情")
    public R<Permission> fetchPermissionById(@PathVariable Integer id) {
        return R.ok(permissionService.fetchPermissionById(id));
    }
    /**
     * 获取权限树信息
     * 通过GET请求访问/tree端点，返回系统的权限树结构
     * 主要用于展示系统所有的权限层级关系，以便于管理员进行权限管理
     * @return 返回一个响应对象R，其中包含一个权限对象列表，这些权限对象组成了权限树
     */
    @GetMapping("/tree")
    @ApiOperation("获取权限树")
    public R<List<Permission>> getPermissionTree() {
        return R.ok(permissionService.fetchPermissionTree());
    }

    /**
     * 获取用户的菜单权限
     *
     * @return 返回用户菜单权限列表
     */
    @GetMapping("/menu")
    @ApiOperation("获取菜单")
    public R<List<Permission>> getPermissionMenu() {
        return R.ok(permissionService.fetchPermissionMenu());
    }

}
